package com.cyj.minio.common.constant.enums;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description: API 统一返回状态码
 * @BelongsProject: SpringBoot-MinIO
 * @BelongsPackage: com.cyj.minio.constant
 * @Author: ChenYongJia
 * @CreateTime: 2021-09-13 14:10
 * @Email: chen87647213@163.com
 * @Version: 1.0
 */
public enum ResultCode {

    /**
     * Success result code.
     * 响应状态码
     */
    /* 成功状态码 1 */
    SUCCESS(1, "操作成功"),
    /* 成功状态码 200 */
    SUCCESS200(200, "操作成功"),
    /* 失败状态码 */
    FAILURE(0, "操作失败"),
    /* ERROR状态码 */
    ERROR(500, "系统异常"),
    /* ERROR状态码菜单有子菜单无法删除 */
    ERROR_MODULE_NOT_DEL(500, "当前菜单下有子菜单无法删除"),
    /* 参数错误：10001-19999 */
    PARAM_IS_INVALID(10001, "参数无效，请检查提交数据后重新保存~"),
    PARAM_IS_BLANK(10002, "参数为空，请检查提交数据后重新保存~"),
    PARAM_TYPE_BIND_ERROR(10003, "参数类型错误，请检查提交数据后重新保存~"),
    PARAM_NOT_COMPLETE(10004, "参数缺失，请检查提交数据后重新保存~"),
    /* 用户错误：20001-29999*/
    USER_NOT_LOGGED_IN(20001, "用户未登录，请登陆后重新操作~"),
    USER_LOGIN_ERROR(20002, "账号不存在或密码错误，请检查提交数据后重新提交~"),
    USER_ACCOUNT_FORBIDDEN(20003, "账号已被禁用，请联系系统管理员"),
    USER_NOT_EXIST(20004, "用户不存在，请检查提交数据后重新提交~"),
    USER_HAS_EXISTED(20005, "用户已存在，请检查提交数据后重新提交~"),
    ROLE_HAS_EXISTED(20005, "角色已存在，请检查提交数据后重新提交~"),
    MODULE_HAS_EXISTED(20005, "菜单已存在，请检查提交数据后重新提交~"),
    DEP_HAS_EXISTED(20005, "部门已存在，请检查提交数据后重新提交~"),
    USER_TOKEN_IS_INVALID(20006, "用户当前授权令牌无效，请重新登陆！"),
    USER_TOKEN_OVERDUE(20006, "用户当前授权令牌过期，请重新登陆！"),
    USER_PASSWORD_NO_AGREE(20007, "新密码与旧密码不一致，请重新尝试！"),
    USER_NAME_ISNULL(20008, "用户名不能为空，请检查提交数据后重新提交！"),
    USER_PASSWORD_ISNULL(20009, "用密码不能为空，请检查提交数据后重新提交！"),
    USER_PASSWORD_ERROR(20009, "用户密码输入错误，密码连续输入错误三次将锁定账号！"),
    /* 业务错误：30001-39999 */
    SPECIFIED_QUESTIONED_USER_NOT_EXIST(30001, "某业务出现问题"),
    /* 系统错误：40001-49999 */
    SYSTEM_ERROR(40001, "系统异常，请稍后重试"),
    SYSTEM_INNER_ERROR(40002, "系统繁忙，请稍后重试"),
    DO_SUBMIT_REQUEST(40003, "请勿重复提交请求"),
    /* 数据错误：50001-599999 */
    RESULE_DATA_NONE(50001, "数据未找到，请联系系统管理员~"),
    DATA_IS_WRONG(50002, "数据有误，请稍后重试！"),
    DATA_ALREADY_EXISTED(50003, "数据已存在，请联系系统管理员~"),
    /* 接口错误：60001-69999 */
    INTERFACE_INNER_INVOKE_ERROR(60001, "内部系统接口调用异常，请稍后重试！"),
    INTERFACE_OUTTER_INVOKE_ERROR(60002, "外部系统接口调用异常，请稍后重试！"),
    INTERFACE_FORBID_VISIT(60003, "该接口禁止访问，请联系系统管理员！"),
    INTERFACE_ADDRESS_INVALID(60004, "接口地址无效，请稍后重试！"),
    INTERFACE_REQUEST_TIMEOUT(60005, "接口请求超时，请稍后重试！"),
    INTERFACE_EXCEED_LOAD(60006, "接口负载过高，请稍后重试！"),
    /* 权限错误：70001-79999 */
    PERMISSION_NO_ACCESS(70001, "无访问权限，请联系系统管理员~"),
    /* 其他错误：80001-89999 */
    BODY_NOT_MATCH(80001, "空指针异常，请稍后重试！"),
    REDIS_IN_SET_VALUE(80002, "Redis存入值失败，请稍后重试！");


    private Integer code;

    private String message;

    ResultCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * Gets message.
     *
     * @param name the name
     * @return the message
     */
    public static String getMessage(String name) {
        for (ResultCode item : ResultCode.values()) {
            if (item.name().equals(name)) {
                return item.message;
            }
        }
        return name;
    }

    /**
     * Gets code.
     *
     * @param name the name
     * @return the code
     */
    public static Integer getCode(String name) {
        for (ResultCode item : ResultCode.values()) {
            if (item.name().equals(name)) {
                return item.code;
            }
        }
        return null;
    }

    /**
     * The entry point of application.
     * 校验重复的code值 (**可去除**)
     *
     * @param args the input arguments
     */
    public static void main(String[] args) {
        ResultCode[] ApiResultCodes = ResultCode.values();
        List<Integer> codeList = new ArrayList<Integer>();
        for (ResultCode ApiResultCode : ApiResultCodes) {
            if (codeList.contains(ApiResultCode.code)) {
                System.out.println(ApiResultCode.code);
            } else {
                codeList.add(ApiResultCode.code());
            }
        }
        System.out.println(ResultCode.getMessage("SUCCESS"));
        System.out.println(ResultCode.getCode("SUCCESS"));
    }

    public Integer code() {
        return this.code;
    }

    public String message() {
        return this.message;
    }

    @Override
    public String toString() {
        return this.name();
    }

}
